<!doctype html>
<style type="text/css">@media screen { }</style>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<div id=log></div>
<script>
var rules = document.styleSheets[0].cssRules;
var mediaList = rules.item(0).media;

// - appendMedium()

test(function () {
    mediaList.mediaText = "screen";
    mediaList.appendMedium("tv, screen");
    assert_equals(mediaList.mediaText, "screen");
    // CSSOM 4.1: Parsing media query returns none as
    // there are more than one; terminate steps.
}, "Add 'tv, screen' to 'screen'");

test(function () {
    mediaList.mediaText = "screen";
    mediaList.appendMedium("tv");
    assert_equals(mediaList.mediaText, "screen, tv");
    // The valid media query is appended.
}, "Add 'tv' to 'screen'");

test(function () {
    mediaList.mediaText = "screen, tv";
    mediaList.appendMedium("tv");
    assert_equals(mediaList.mediaText, "screen, tv");
    // CSSOM says to ignore if it exists, terminate steps.
}, "Add 'tv' to 'screen, tv'");

test(function () {
    mediaList.mediaText = "screen, tv";
    mediaList.appendMedium("screen");
    assert_equals(mediaList.mediaText, "screen, tv");
    // CSSOM says to ignore if it exists, where as
    // CSS 2.1 says to remove existing and then add
    // it to the end.
    // http://dev.w3.org/csswg/cssom/#dom-medialist-appendmedium
    // http://www.w3.org/TR/2000/REC-DOM-Level-2-Style-20001113/stylesheets.html
}, "Add 'screen' to 'screen, tv'");

test(function () {
    mediaList.mediaText = "screen, tv";
    mediaList.appendMedium(" ");
    // Ignored; terminate steps.
    assert_equals(mediaList.mediaText, "screen, tv");
}, "Add ' ' to 'screen, tv'");

test(function () {
    mediaList.mediaText = "screen, tv";
    mediaList.appendMedium("");
    // Ignored; terminate steps.
    assert_equals(mediaList.mediaText, "screen, tv");
}, "Add '' to 'screen, tv'");

test(function () {
    mediaList.mediaText = "screen, tv";
    mediaList.appendMedium(",");
    assert_equals(mediaList.mediaText, "screen, tv");
    // CSSOM 4.1: Parsing media query returns none as
    // there are more than one; terminate steps.
}, "Add ',' to 'screen, tv'");

test(function () {
    mediaList.mediaText = "screen, tv";
    mediaList.appendMedium("&invalid");
    assert_equals(mediaList.mediaText, "screen, tv, not all");
    // Ignored; terminate steps.
}, "Add '&invalid' to 'screen, tv'");

test(function () {
    mediaList.mediaText = "screen, tv";
    mediaList.appendMedium("not all");
    assert_equals(mediaList.mediaText, "screen, tv, not all");
}, "Add 'not all' to 'screen, tv'");

test(function () {
    mediaList.mediaText = "screen, tv";
    mediaList.appendMedium("#?:/");
    assert_equals(mediaList.mediaText, "screen, tv, not all");
    // Ignored; terminate steps.
}, "Add '#?:/' to 'screen, tv'");

test(function () {
    mediaList.mediaText = "screen, tv";
    assert_throws_js(TypeError,
                     function () { document.appendMedium(); },
                     "Not enough arguments");
}, "Add without argument");

// - deleteMedium()

test(function () {
    mediaList.mediaText = "screen, tv, not all";
    mediaList.deleteMedium("&invalid");
    // Ignored; terminate steps.
    assert_equals(mediaList.mediaText, "screen, tv");
}, "Remove '&invalid' from 'screen, tv, not all'");

test(function () {
    mediaList.mediaText = "screen, tv";
    assert_throws_dom("NOT_FOUND_ERR",
        function () { mediaList.deleteMedium("not all"); }
    );
    // Not found; throw NotFoundError.
}, "Remove 'not all' from 'screen, tv'");

test(function () {
    mediaList.mediaText = "screen, tv";
    assert_throws_dom("NOT_FOUND_ERR",
        function () { mediaList.deleteMedium("cow"); }
    );
    // Not found; throw NotFoundError.
}, "Remove 'cow' from 'screen, tv'");

test(function () {
    mediaList.mediaText = "screen, tv, not all";
    mediaList.deleteMedium("not all");
    assert_equals(mediaList.mediaText, "screen, tv");
    // Remove any media query from the collection of media queries
    // for which comparing the media query returns true.
}, "Remove 'not all' from 'screen, tv, not all'");

test(function () {
    mediaList.mediaText = "screen, tv";
    mediaList.deleteMedium("tv");
    assert_equals(mediaList.mediaText, "screen");
    // Remove any media query from the collection of media queries
    // for which comparing the media query returns true.
}, "Remove 'tv' from 'screen, tv'");

test(function () {
    mediaList.mediaText = "not all, not all, tv, not all";
    mediaList.deleteMedium("not all");
    assert_equals(mediaList.mediaText, "tv");
    // Remove any media query from the collection of media queries
    // for which comparing the media query returns true.
}, "Remove 'not all' from 'not all, not all, tv, not all'");

test(function () {
    mediaList.mediaText = "not all, not all, tv, not all";
    mediaList.deleteMedium("tv");
    assert_equals(mediaList.mediaText, "not all, not all, not all");
    // Remove any media query from the collection of media queries
    // for which comparing the media query returns true.
}, "Remove 'tv' from 'not all, not all, tv, not all'");

test(function () {
    mediaList.mediaText = "tv, print, screen";
    mediaList.deleteMedium("tv, print");
    assert_equals(mediaList.mediaText, "tv, print, screen");
    // CSSOM 4.1: Parsing media query returns none as
    // there are more than one; terminate steps.
}, "Remove 'tv, print' from 'screen, tv, screen'");

test(function () {
    mediaList.mediaText = "screen, tv, not all";
    mediaList.deleteMedium("#?:/");
    // Ignored; terminate steps.
    assert_equals(mediaList.mediaText, "screen, tv");
}, "Remove '#?:/' from 'screen, tv, not all'");

test(function () {
    mediaList.mediaText = "tv, print, screen";
    assert_throws_js(TypeError,
                     function () { document.deleteMedium(); },
                     "Not enough arguments");
}, "Remove without argument");
</script>
